package cn.tedu.boqi.shop.order.service.impl;

import cn.tedu.boqi.shop.order.exception.ServiceException;
import cn.tedu.boqi.shop.order.mapper.CartMapper;
import cn.tedu.boqi.shop.order.pojo.dto.CartAddDto;
import cn.tedu.boqi.shop.order.pojo.dto.CartUpdateDTO;
import cn.tedu.boqi.shop.order.pojo.entity.Cart;
import cn.tedu.boqi.shop.order.pojo.vo.CartStandardVO;
import cn.tedu.boqi.shop.order.service.CartService;
import cn.tedu.boqi.shop.order.web.JsonResult;
import cn.tedu.boqi.shop.order.web.ServiceCode;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    CartMapper cartMapper;

    @Override
    public void add(CartAddDto cartAddDto) {
        //统计当前用户购物车中是否有当前商品
        Cart cart = new Cart();
        CartStandardVO vo = cartMapper.selectByProductIdAnduserId(cartAddDto.getProductId(), cartAddDto.getUserId());
        synchronized (cartAddDto) {
            if (vo != null) {
                //如果存在就去修改库存
                //然后结束方法执行

                cart.setProductCount(cartAddDto.getProductCount() + vo.getProductCount());
                cart.setId(vo.getId());
                cartMapper.updateById(cart);

                return;
            }
            //如果不存在就会添加商品
            BeanUtils.copyProperties(cartAddDto, cart);
            cartMapper.add(cart);
        }
    }

    /**
     * 处理勾选购物车方法
     * 并且返回购物车勾选商品的数量
     * @param cartUpdateDTO 客户端提交的修改数据
     * @Author 王飞
     */
    @Override
    public Integer updateStatus(Long id,CartUpdateDTO cartUpdateDTO) {
        String[] status={"未勾选","已勾选"};
        //查询出原先的数据去做数据判断
        CartStandardVO vo = cartMapper.selectByProductIdAnduserId(cartUpdateDTO.getProductId(), cartUpdateDTO.getUserId());
        //首先判断数据是否存在
        //如果不存在就报错
        if (vo==null){
            throw new ServiceException("数据不存在", ServiceCode.NOT_FOUND);
        }
        //判断当前数据是否是和操作的状态相同
        //如果相同就失败
        Integer state = cartUpdateDTO.getCartStatus();
        if(state==vo.getCartStatus()){
            throw new ServiceException("当前数据已是"+status[state]+"状态",ServiceCode.ERR_CONFIT);
        }
        Cart cart = new Cart();
        BeanUtils.copyProperties(cartUpdateDTO,cart);
        cart.setId(id);
        cartMapper.updateById(cart);
        //返回勾选好商品的数量的结果
        int count = cartMapper.countByStatus(cart.getUserId());
        return count;
    }
}
